package sim_moteur.element;

import sim_moteur.Coordonnee;

public class Chose {

	public final static String NOM_DEFAUT = "";
	protected Coordonnee coordonnees;
	protected Coordonnee coordonneesPrecedentes;

	private String name;
	private String simulateurName;

	public Chose(String name, String simulateurName) {
		// La chose n'est pas placée sur le terrain
		coordonnees = new Coordonnee(0, 0);
		coordonneesPrecedentes = new Coordonnee(-1,-1); //pas encore utilisée
		this.simulateurName = simulateurName;
		if (valideName(name)) {
			this.name = name;
		} else {
			name = NOM_DEFAUT;
		}
	}

	private boolean valideName(String name) {
		return name != null && name.length() > 3;
	}

	public Coordonnee getCoordonnees() {
		return coordonnees;
	}
	
	public Coordonnee getCoordonneesPrecedentes() {
		return coordonneesPrecedentes;
	}

	// Seule la classe terrain devrait appeler cette méthode.

	/**
	 * Enregistre la coordonnée de la chose et garde également sa dernière coordonnée
	 * @param coordonnees
	 */
	public void setCoordonnees(Coordonnee coordonnees) {
		this.coordonneesPrecedentes = this.coordonnees;
		this.coordonnees = coordonnees;
	}
	
	public boolean aBouge()
	{
		return ! coordonnees.equals(coordonneesPrecedentes);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Indique si la chose peut partager sa coordonnée avec l'item passé en paramètre.
	 * @param item l'item à mettre par dessus
	 * @return vrai si la cohabitation est possible
	 */
	public boolean recoit(Chose item) {
		// Par défaut, un objet est seul sur un espace du terrain.
		return false;
	}

	public String toString() {
		return name + "\nposition: (" + coordonnees.getX() + ", " + coordonnees.getY()
				+ ")"+ "\n"+"simulateur: "+simulateurName+"\n";
	}
	
	public String getSimulateurName() {
		return simulateurName;
	}

	/**
	 * Indique si la chose est vivante
	 * @return vrai si la chose est vivante
	 */
	public boolean estVivant()
	{
		// Une chose n'est pas vivante par défaut.
		return false;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((coordonnees == null) ? 0 : coordonnees.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Chose other = (Chose) obj;
		if (coordonnees == null) {
			if (other.coordonnees != null)
				return false;
		} else if (!coordonnees.equals(other.coordonnees))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	

}
